home *** CD-ROM | disk | FTP | other *** search
- *cX OPTIMIZACION EN ASSEMBLER
- *cR
- En esta serie de artículos trataré de
- enseñaros cosas sobre optimización de código
- y pequeños truquillos que harán que vuestro
- programa en ensamblador gane en velocidad y
- elegancia.
- *cT
- OPTIMIZACION EN COMPARACIONES
- *cR
- En una instrucción de comparación, hay
- ciertas cosas que tenemos que tener en cuen-
- ta.
- Tomemos como ejemplo *cYCMP AX, 2121h*cR. Esta
- instrucción simula una resta a *cYAX*cR de *cY2121h*cR
- unidades, modificando las banderas (ya sa-
- béis, si da 0, entonces el flag Z se activa;
- si no hay rebosamiento, es decir, si *cYAX*cR es
- mayor que *cY2121h *cRentonces se activa el flag A
- o el G (de Greater), y si *cY2121h *cRes mayor que
- AX, entonces se activa el C (*cBCarry Flag*cR, que
- también puede ser tratado como flag B, de
- *cBBelow*cR).
- Si queremos comprobar esto, hay diferentes
- maneras de hacerlo y que hacen lo mismo que
- *cYCMP XX, YYYY*cR. Por ejemplo:
-
- - Si *cTAX*cR no lo vamos a utilizar después,
- podemos usar la instrucción *cTXOR *cRpara la
- comprobación, puesto que si hacemos *cY XOR
- AX, 2121h*cR, si *cTAX *cRes *cT2121h *cRéste se quedará a
- 0, activándose el flag Z como en *cTCMP*cR, y
- además *cTXOR *cRes más rápido que *cT CMP*cR. Claro
- está que aquí no nos habrá de importar si
- *cTAX *cRestá por encima o por debajo en caso de
- que no sea 0.
-
- - En caso de que *cTAX *cRqueramos usarlo des
- pués, tendremos que usar *cTCMP*cR.
-
- - Si tan sólo quisiéramos mirar si AX es
- 0, hay varias maneras, y la más lenta (en
- términos de procesador) es *cYCMP AX, 0*cR. Hay
- otras maneras más rápidas, en concreto
- todas las de operaciones a nivel de bits.
- *cY«OR AX, AX»*cR, *cY«AND AX, AX»*cR y *cY«TEST AX, AX»*cR
- encenderán el flag Z si AX es 0, y no en
- caso contrario, dejando además AX intacto.
-
- Y después están las bifurcaciones. Las
- banderas sólo serán modificadas por operacio-
- nes e instrucciones, y nunca "porque sí", por
- lo que no debemos temer que se modifiquen si
- nosotros no hemos puesto nada para ello.
- Entonces, esto nos permite hacer varios
- saltos condicionales sin necesidad de volver
- a comparar. Quiero decir, que no es preciso
- que antes de un salto condicional vaya una
- instrucción de cambio de banderas, porque
- estas se conservan. Veamos un ejemplo:
- Esto sería la manera sin optimizar:
- *cN
- CMP AX, 2121h
- JZ Opcion1
- CMP AX, 2121h
- JB Opcion2
- CMP AX, 2121h
- JA Opcion3
- ...
- *cR
- Y esto la manera optimizada:
- *cN
- CMP AX, 2121h
- JZ Opcion1
- JA Opcion2
- JB Opcion3
- *cR
- La estructuración del código máquina nos
- permite hacer esto (y encima, queda muy
- elegante).
- Después, si os miráis la sección de "Técni-
- cas Víricas" veréis un montón de ejemplos de
- optimizaciones de código, porque en un virus
- se practica esto hasta la saciedad (aunque
- más las optimizaciones de tamaño que de
- velocidad).
- Más trucos. Imaginad que queremos saber si
- AX es el valor 0FFFFh. Más rápido que hacer
- *cYCMP AX, 0FFFFh *cRes esto:
- *cN
- INC AX
- JZ Opcion1
- *cR
- No es que sea gran cosa, pero gana en
- velocidad y vistosidad, y da la impresión de
- que controlamos el tema (y, de hecho, lo
- controlamos). Si fuera comprobar si AX es 1,
- pues hacemos *cYDEC AX*cR en vez de *cYINC AX*cR.
- Bueno, pues en el próximo número más.
- Empezaremos con optimización de código nor-
- mal, porque espero que en comparaciones
- hayais captado la idea.
-
- *cN Líyak el Oscuro
-